#include "BSP_SysTick.h"
#include "tos_k.h" 
static  uint16_t  fac_us = 0;
//初始化延迟函数
//当使用OS的时候,此函数会初始化OS的时钟节拍
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void BSP_SysTickInit()
{
	u32 reload;//装载次数
	/*滴答定时频率配置72MHZ,而心跳中断需要1ms中断一次，那么装载计数值->X = 0.0001s/(1/72000000) = 72000次  */
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟  HCLK = SystemCoreClock = 72000000HZ
	reload=SystemCoreClock/1000000;				//reload = 72
		fac_us=SystemCoreClock/1000000;				//fac_us = 72
	reload*=1000000/TOS_CFG_CPU_TICK_PER_SECOND;		//根据configTICK_RATE_HZ设定溢出时间 
																									//reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右	   
	SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;   	//开启SYSTICK中断
	SysTick->LOAD=reload; 						//滴答定时频率72MHZ，72000*（1/72000000） = 1ms
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;   	//开启SYSTICK 
}

void SysTick_Handler(void)//1ms中断一次
{
	 if (tos_knl_is_running())
  {
    tos_knl_irq_enter();
    tos_tick_handler();
    tos_knl_irq_leave();
  }
}
void delay_us(u32 nus)
{		
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=nus*fac_us; 						//需要的节拍数 
	told=SysTick->VAL;        				//刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}  
	};										    
}
//延时nms,不会引起任务调度
//nms:要延时的ms数
void delay_xms(u32 nms)
{
	u32 i;
	for(i=0;i<nms;i++) delay_us(1000);
}


